home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Viewers / aa_m68k_Intel_Only / ToyViewer1.2 / Source / TVwinMgr.m < prev   
Encoding:
Text File  |  1995-11-12  |  4.2 KB  |  229 lines

  1. #import  "TVController.h"
  2. #import  <dpsclient/dpsNeXT.h>    // for TimedEntry
  3. #import  <appkit/Application.h>
  4. #import  <appkit/publicWraps.h>
  5. #import  <appkit/Control.h>
  6. #import  <appkit/MenuCell.h>
  7. #import  <objc/NXBundle.h>    /* LocalizedString */
  8. #import  <stdio.h>
  9. #import  <stdlib.h>
  10. #import  <string.h>
  11. #import  <objc/zone.h>
  12. #import  <mach/mach_init.h>
  13. #import  "ToyWin.h"
  14. #import  "ToyView.h"
  15. #import  "Background.h"
  16. #import  "common.h"
  17.  
  18. #define     MAXWindows    80
  19.  
  20. @implementation TVController (WindowManager)
  21.  
  22. static int winp = 0, showp = 0;
  23. static ToyWin *wintab[MAXWindows];
  24. static DPSTimedEntry teNum;
  25. static Window *backWin;
  26. NXZone *backZone;
  27.  
  28. - newWindow: (ToyWin *)win
  29. {
  30.     if (winp < MAXWindows)
  31.         wintab[winp++] = win;
  32.     return self;
  33. }
  34.  
  35. - checkWindow: (ToyWin *)win delete:(BOOL)delflag;
  36. {
  37.     /* Return Value:  nil: No such window,  self: Success */
  38.     int i, j;
  39.  
  40.     j = -1;
  41.     for (i = 0; i < winp; i++)
  42.         if (wintab[i] == win) {
  43.             j = i;
  44.             break;
  45.         }
  46.     if (j < 0) return nil;
  47.     if (delflag) {
  48.         --winp;
  49.         for (i = j; i < winp; i++)
  50.             wintab[i] = wintab[i + 1];
  51.     }
  52.     return self;
  53. }
  54.  
  55. - deleteAllWindow: sender
  56. {
  57.     int i, n;
  58.  
  59.     n = winp, winp = 0;
  60.     for (i = 0; i < n; i++)
  61.         [[wintab[i] window] performClose: sender];
  62.     return self;
  63. }
  64.  
  65.  
  66. static void wakeup(DPSTimedEntry te, double now, void *data)
  67. {
  68.     if (showp >= winp) {
  69.         DPSRemoveTimedEntry(teNum);
  70.         showp = 0;
  71.     }else
  72.         [[wintab[showp++] window] orderFront: (id)data];
  73. }
  74.  
  75. - showAllWindow: sender
  76. {
  77.     if (winp <= 0) return self;
  78.     if (showp > 0) {
  79.         DPSRemoveTimedEntry(teNum);
  80.         showp = 0;
  81.     }else {
  82.         [[wintab[0] window] orderFront: sender];
  83.         teNum = DPSAddTimedEntry(0.8, &wakeup, self, NX_BASETHRESHOLD);
  84.         showp = 1;
  85.     }
  86.     return self;
  87. }
  88.  
  89. - keyWindow
  90. {
  91.     int i;
  92.  
  93.     for (i = 0; i < winp; i++)
  94.         if ([[wintab[i] window] isKeyWindow])
  95.             return wintab[i];
  96.     return (winp > 0) ? wintab[winp - 1] : nil;
  97. }
  98.  
  99. - (BOOL)isOpened: (const char *)newfile
  100. {
  101.     int i;
  102.  
  103.     for (i = 0; i < winp; i++)
  104.         if (strcmp(newfile, [wintab[i] filename]) == 0) {
  105.             [[wintab[i] window] makeKeyAndOrderFront: self];
  106.             return YES;
  107.         }
  108.     return NO;
  109. }
  110.  
  111.  
  112. /****** Backgroung ******/
  113.  
  114. - cleanBackground: sender
  115. {
  116.     if (backWin != nil) {
  117.         [backWin free];
  118.         backWin = nil;
  119.         NXDestroyZone(backZone);
  120.         [self backWinFront: NO];
  121.         [menuToFront setEnabled: NO];
  122.         [menuClear setEnabled: NO];
  123.     }else
  124.         NXBeep();
  125.     return self;
  126. }
  127.  
  128. - makeFront: sender
  129. {
  130.     id v;
  131.  
  132.     if (backWin == nil) {
  133.         NXBeep();
  134.         return self;
  135.     }
  136.     if ([(v = [backWin contentView]) isFront]) /* toggle */
  137.         [v toBehind: self];
  138.     else
  139.         [v toFront: self];
  140.     return self;
  141. }
  142.  
  143. - backWinFront: (BOOL)flag
  144. {
  145.     const char *title;
  146.  
  147.     if (flag)
  148.         title = NXLocalizedString("Send to Back", NULL, Background);
  149.     else
  150.         title = NXLocalizedString("Bring to Front", NULL, Background);
  151.     [menuToFront setTitle: title];
  152.     return self;
  153. }
  154.  
  155. - makeBackground: sender
  156. {
  157.     NXRect    rect, *ir;
  158.     Background *view;
  159.     id    tw, tv;
  160.     commonInfo *cinf;
  161.     int method = [sender selectedTag];
  162.     
  163.     if ((tw = [self keyWindow]) == nil) {
  164.         NXBeep();
  165.         return self;
  166.     }
  167.     tv = [tw toyView];
  168.     if (backWin == nil) {
  169.         [NXApp getScreenSize: &rect.size];
  170.         rect.origin.x = rect.origin.y = 0;
  171.         backZone = NXCreateZone(vm_page_size, vm_page_size, YES);
  172.         view = [[Background allocFromZone: backZone] initFrame: &rect];
  173.         [view setController: self];
  174.         backWin = [view initWinAttr];
  175.         [menuToFront setEnabled: YES];
  176.         [menuClear setEnabled: YES];
  177.     }else
  178.         view = [backWin contentView];
  179.     cinf = [tv commonInfo];
  180.     ir = [tv selectedRect];
  181.     if (ir->size.width > 0.0 && ir->size.height > 0.0) {
  182.         id tmp = [[NXImage alloc] initFromImage:[tv image] rect:ir];
  183.         [view setImage: tmp hasAlpha: cinf->alpha with: method];
  184.         [tmp free];
  185.     }else
  186.         [view setImage: [tv image] hasAlpha: cinf->alpha with: method];
  187.     [backWin display];
  188.     NXPing();
  189.     return self;
  190. }
  191.  
  192.  
  193.  
  194. - print: sender
  195. {
  196.     id    tw;
  197.  
  198.     if ((tw = [self keyWindow]) == nil)
  199.         NXBeep();
  200.     else
  201.         [tw print:sender];
  202.     return self;
  203. }
  204.  
  205. - saveAs: sender
  206. {
  207.     ToyWin    *tw;
  208.  
  209.     if ((tw = (ToyWin *)[self keyWindow]) == nil) {
  210.         NXBeep();
  211.         return self;
  212.     }
  213.     switch ([sender selectedTag]) {
  214.     case 0: [tw saveAsTiff: sender];
  215.         break;
  216.     case 1: [tw saveAsEPS: sender];
  217.         break;
  218.     case 2: [tw saveAs: Type_bmp];
  219.         break;
  220.     case 3: [tw saveAs: Type_gif];
  221.         break;
  222.     case 4: [tw saveAs: Type_ppm];
  223.         break;
  224.     }
  225.     return self;
  226. }
  227.  
  228. @end
  229.